/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

///////////////////////////////////////////////////////////
/// \file Network.h Ce fichier procure des fonctions, types 
/// et enumération pour le réseau. Elle s'aide notamment 
/// des fichiers UDP.h pour les sockets UDP, TCP.h pour 
/// les sockets TCP et Error.h pour traiter les erreurs réseaux.
///////////////////////////////////////////////////////////

#ifndef CSLP_NETWORK_HEADER
#define CSLP_NETWORK_HEADER

#ifdef __cplusplus
extern "C" {
#endif

#include "dll.h"

#ifdef WIN32
	#include <winsock2.h>
	#undef ERROR
	#define MSG_NOSIGNAL 0
	
	///////////////////////////////////////////////////
	/// Définition interne
	///////////////////////////////////////////////////
	typedef int socklen_t;
	
	///////////////////////////////////////////////////
	/// Définition des sockets TCP
	///////////////////////////////////////////////////
	typedef SOCKET CSLP_UDPSOCKET;

	///////////////////////////////////////////////////
	/// Définition des sockets UDP
	///////////////////////////////////////////////////
	typedef SOCKET CSLP_TCPSOCKET;
	
	void InitWSA();
	void CloseWSA();
	
#else
	#include <unistd.h>
	#include <sys/socket.h>
	#include <netinet/in.h>
	#include <arpa/inet.h>

	///////////////////////////////////////////////////
	/// Définition interne
	///////////////////////////////////////////////////
	typedef struct sockaddr_in SOCKADDR_IN;

	///////////////////////////////////////////////////
	/// Définition interne
	///////////////////////////////////////////////////
	typedef struct sockaddr SOCKADDR;

	///////////////////////////////////////////////////
	/// Définition des sockets TCP
	///////////////////////////////////////////////////
	typedef int CSLP_UDPSOCKET;

	///////////////////////////////////////////////////
	/// Définition des sockets UDP
	///////////////////////////////////////////////////
	typedef int CSLP_TCPSOCKET;
#endif

///////////////////////////////////////////////////////////
/// Définie le nombre de caractères maximal que contient une IP sous
/// forme de chaine de caractères au forma "xxx.xxx.xxx.xxx\0"
///////////////////////////////////////////////////////////
#define CSLP_MAX_IP_LENGHT 16

///////////////////////////////////////////////////////////
/// Définie la valeur d'un socket invalide (code d'erreur).
///////////////////////////////////////////////////////////
#define CSLP_INVALID_SOCKET -1

///////////////////////////////////////////////////////////
/// Enumération décrivant l'état d'erreur du socket après une oppération
///////////////////////////////////////////////////////////
typedef enum CSLP_NETWORK_ERROR {
	ERROR,
	NONE,
	DISCONNECTED
} CSLP_NETWORK_ERROR;



///////////////////////////////////////////////////////////
/// Permet de convetir une IP sous forme d'entier au format big endian
/// en une chaine de caractère.
///
/// \param IP L'addresse IP au format big endian à convertire en chaine.
/// \return Un pointeur alloué par le noyau ou WSA sur la chaine de caratère
/// correspondant à l'IP passée en paramètre.
/// \return NULL en cas d'erreur.
///////////////////////////////////////////////////////////
char DLL_IMPEXP * CSLP_ULongIPToString(unsigned long IP);

///////////////////////////////////////////////////////////
/// Permet de convertire une IP sous forme de chaine de caractère 
/// en un entier au format big endian.
///
/// \param IP L'adresse IP à convertir en entier.
/// \return Un entier au format big endian correspondant à 
/// l'adresse IP passée en paramètre.
///////////////////////////////////////////////////////////
unsigned long DLL_IMPEXP CSLP_StringIPToULong(const char* IP);

///////////////////////////////////////////////////////////
/// Permet de convertir un entier au format "big endian"
///
/// \param uLong L'entier à convertir
/// \return uLong au format big endian
///////////////////////////////////////////////////////////
unsigned long DLL_IMPEXP CSLP_ULongToBigEndian(unsigned long uLong);

#ifdef __cplusplus
}
#endif

#endif

